package com.ruoyi.system.vo.weishuapay;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.util.TextUtils;

import com.ruoyi.common.utils.Md5Utils;



public class MD5WSUtil{

	private static final String[] hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
	 * 签名
	 * @param SortedMap
	 * @param md5Key 注意md5key各家不同
	 * @return
	 */
	public static String signData(Map<String, String> SortedMap, String md5Key) {
		List<String> stringSort = new ArrayList<String>();

		for (java.util.Map.Entry<String, String> entry : SortedMap.entrySet()) {
			if (entry.getValue() != null && !"".equals(entry.getValue())
					&& !"null".equals(entry.getValue()) && !entry.getKey().equals("sign") && !entry.getKey().equals("pl_sign") ) {
				stringSort.add(entry.getKey());
			//	logger.debug("========"+  entry.getKey()+"========["+entry.getValue()+"]");
			}
		}
		Collections.sort(stringSort, Collator.getInstance(Locale.CHINA));//排序
		StringBuffer signDatas = new StringBuffer();
		for (int i = 0; i < stringSort.size(); i++) {
			signDatas.append(SortedMap.get(stringSort.get(i)));
		}
		signDatas.append(md5Key);
		String sign = encrypt2MD5(signDatas.toString());
		return sign;
	}
	/*
	public static String signDatabc(Map<String, String> SortedMap, String md5Key) {
		List<String> stringSort = new ArrayList<String>();

		for (java.util.Map.Entry<String, String> entry : SortedMap.entrySet()) {
			if (entry.getValue() != null && !"".equals(entry.getValue())
					&& !"null".equals(entry.getValue()) && !entry.getKey().equals("sign") && !entry.getKey().equals("pl_sign") ) {
				stringSort.add(entry.getKey());
			//	logger.debug("========"+  entry.getKey()+"========["+entry.getValue()+"]");
			}
		}
		Collections.sort(stringSort, Collator.getInstance(Locale.CHINA));//排序
		StringBuffer signDatas = new StringBuffer();
		for (int i = 0; i < stringSort.size(); i++) {
				signDatas.append(stringSort.get(i)).append("=").append(SortedMap.get(stringSort.get(i))).append("&");
		}
		String s = signDatas.substring(0, signDatas.length()-1);
		String ss = s+md5Key;
		System.out.println("加密测试的测试参数为"+ss);
		return Md5Utils.md5(ss).toUpperCase();
	}*/

	public static String encrypt2MD5(String originstr) {
		String result = null;
		// 用来将字节转换成 16 进制表示的字符
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };
		if (originstr != null && !"".equals(originstr)) {
			try {
				// 返回实现指定摘要算法的 MessageDigest 对象
				MessageDigest md = MessageDigest.getInstance("MD5");
				// 使用utf-8编码将originstr字符串编码并保存到source字节数组
				byte[] source = originstr.getBytes("utf-8");
				// 使用指定的 byte 数组更新摘要
				md.update(source);
				// 通过执行诸如填充之类的最终操作完成哈希计算,结果是一个128位的长整数
				byte[] tmp = md.digest();
				// 用16进制数表示需要32位
				char[] str = new char[32];
				for (int i = 0, j = 0; i < 16; i++) {
					// j表示转换结果中对应的字符位置
					// 从第一个字节开始,对 MD5 的每一个字节
					// 转换成 16 进制字符
					byte b = tmp[i];

					// 取字节中高 4 位的数字转换
					// 无符号右移运算符>>> ,它总是在左边补0
					// 0x代表它后面的是十六进制的数字. f转换成十进制就是15
					str[j++] = hexDigits[b >>> 4 & 0xf];

					// 取字节中低 4 位的数字转换
					str[j++] = hexDigits[b & 0xf];
				}

				// 结果转换成字符串用于返回
				result = new String(str);

			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}

		}

		return result;
	}

	public static String encode(String content) {
		try {
			return URLEncoder.encode(content, "UTF-8");// content;//
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	public static String decode(String content) {
		try {
			return URLDecoder.decode(content, "UTF-8");// content;//
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	
	public static String MD5Encode(String origin,String charsetname) {
		String resultString = null;
		resultString = origin;
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("MD5");
			if(TextUtils.isEmpty(charsetname)){
				resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
			}else {
				resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return resultString;
	}
	
	/**
	 * MD5编码
	 * 
	 * @param origin
	 *            原始字符串
	 * @return 经过MD5加密之后的结果
	 */
	public static String MD5Encode(String origin) {
		return MD5Encode(origin, null);
	}
	private static String byteArrayToHexString(byte[] byteArray) {
        StringBuffer sb = new StringBuffer();
        for (byte b : byteArray) {
            sb.append(byteToHexChar(b));
        }
        return sb.toString();
    }
	private static Object byteToHexChar(byte b) {
        int n = b;
        if (n < 0) {
            n = 256 + n;
        }
        int d1 = n / 16;
        int d2 = n % 16;
        return hex[d1] + hex[d2];
    }
	
	public static String getMD5Str(String str) {
		   byte[] msg = str.getBytes();
			MessageDigest messageDigest = null;
			try {
				messageDigest = MessageDigest.getInstance("MD5");
				messageDigest.reset();
				messageDigest.update(msg);
			} catch (NoSuchAlgorithmException e) {
			}
			byte[] b = messageDigest.digest();
			return new String(Base64.encodeBase64(b));
	    }  

	
}
